3.12 Виджеты. ListView GridView
5 из 5 шагов пройдено

 Виджеты. ListView GridView

➡️ Скачать презентацию. Flutter ListView GridView
➡️ Ссылка на репозиторий с кодом этого урока

Виджет GridView

GridView прокручиваемый виджетr, который позволяет располагать дочерние элементы в виде сетки. Он используется, когда нужно отобразить элементы в табличной структуре, например, галерею изображений, список товаров в интернет-магазине, плитки с информацией и т. д.

GridView.count

GridView.count - используется, когда количество колонок известно заранее.

import 'package:flutter/material.dart';

class GridViewExample1 extends StatelessWidget {
  const GridViewExample1({super.key});

  @override
  Widget build(BuildContext context) {
    return GridView.count(
      crossAxisCount: 3, // Количество колонок
      crossAxisSpacing: 10, // Расстояние между колонками
      mainAxisSpacing: 10, // Расстояние между строками

      padding: EdgeInsets.all(16),
      children: List.generate(9, (index) {
        return Container(
          decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(16),
            color: Colors.blue[200],
          ),
          alignment: Alignment.center,
          child: Text('Элемент ${index + 1}'),
        );
      }),
    );
  }
}

 

GridView.extent

GridView.extent - позволяет задать максимальную ширину элементов, автоматически подстраивая количество колонок.

class GridViewExample2 extends StatelessWidget {
  const GridViewExample2({super.key});

  @override
  Widget build(BuildContext context) {
    return GridView.extent(
      maxCrossAxisExtent: 100, // Максимальная ширина элемента
      crossAxisSpacing: 10,
      mainAxisSpacing: 10,
      children: List.generate(15, (index) {
        return Container(
          decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(16),
            color: Colors.blue[200],
          ),
          alignment: Alignment.center,
          child: Text(
            'Элемент $index',
          ),
        );
      }),
    );
  }
}

 

GridView.builder

GridView.builder - используется, когда количество элементов неизвестно заранее (например, загружается с сервера).

class GridViewExample3 extends StatelessWidget {
  const GridViewExample3({super.key});

  @override
  Widget build(BuildContext context) {
    return GridView.builder(
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: 3,
        crossAxisSpacing: 15,
        mainAxisSpacing: 15,
        childAspectRatio: 1.5, // Соотношение сторон
      ),
      itemCount: 20,
      itemBuilder: (context, index) {
        return Container(
          color: Colors.white,
          alignment: Alignment.center,
          child: Text('Элемент $index'),
        );
      },
    );
  }
}

 

Зачем нужен AspectRatio

Виджет AspectRatio во Flutter используется для управления соотношением сторон дочернего виджета.

Он позволяет задать фиксированное соотношение ширины и высоты (width-to-height ratio) для своего дочернего элемента (child), что может быть полезно в различных сценариях, таких как создание адаптивных интерфейсов, работа с изображениями или видео, а также при создании сеток и других компоновок.

AspectRatio принимает два параметра:

  • aspectRatio — число, задающее соотношение сторон (ширина / высота).
  • child — дочерний виджет, который будет ограничен этим соотношением.
AspectRatio(
  aspectRatio: 16 / 9, // Соотношение сторон 16:9
  child: Container(
    color: Colors.blue,
  ),
);

В этом примере создаётся контейнер с соотношением сторон 16:9. Независимо от размера родительского контейнера, этот элемент всегда будет сохранять заданное соотношение.

Что такое соотношение сторон?

Соотношение сторон (aspect ratio) — это пропорция между шириной и высотой элемента. Оно выражается в виде дроби, например:

  • 1:1 — квадрат (ширина равна высоте)
  • 16:9 — широкоформатный прямоугольник (ширина больше высоты)
  • 4:3 — классический прямоугольник (ширина немного больше высоты)
Как рассчитывается соотношение сторон?

Соотношение сторон рассчитывается как отношение ширины к высоте:

  • Для соотношения 16 / 9 aspectRatio ≈ 1.78
  • Для соотношения 1 / 1 aspectRatio ≈ 1

Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий
Комментарий закреплён